<?php
    /*
     * Siia algusesse, (enne html algustagi asuvasse koodi) tullakse sisuliselt ainult siis, kui 
     * keegi on vajutanud veebilehel vormi submit nupule. See on saatnud GET meetodi abil 
     * vormi sisu andmed siia samasse lehele tagasi. S.t. siinsed andmed kõigepealt valideeritakse, 
     * (ehk kontrollitakse nende vastavust ärireeglitele) enne, kui selle sisu saadetakse edasi 
     * järgmisele lehele, mis nende andmetega midagi peale hakkab. 
     * 
     * Siin on kasutatud GET meetodit, kuna POST meetodi jaoks sarnast mustrit järgides, oleks 
     * vaja tunda superglobaalset muutujat  $_SESSION
     */

    //Algväärtustame muutujad
    $kasutajaTaidetudValjadeSisuSailitajaMassiiv = array();
    //defineerin konstandid
    define("MINIMAALNE_SISESTATAV_SYNNIAASTA_VAARTUS", 1900);
    //et järgmisel aastal programmi tagasi ei peaks tulema ja sünniaastat nt 2014 
    //peale muutma, kalendrit, küsides funktsiooniga date() ja selle parameetri 'Y' ehk year
    //väljundit praeguse aastanumbri teadasaamiseks. 
    $systeemiAastaarv = date('Y');     
    $vigadeMassiiv = array();
    $noutudValjad = array('nimi', 'synniaasta');
    
    
    //Vaatan, kas keegi on submit nuppu vajutanud ning seega vormi iseendale (siia samale lehele tagasi)
    //postitanud. Seda saab olla tehtud vaid siis, kui $_GET superglobaalses sildistatud massiivis
    //on talletatud nimiväärtus "submitNupp" (ehk form submit input välja nimi)
    if (isset($_GET["submitNupp"]))
    {   
        //Nõutud väljade massiivis on info vormi parameetri name="valjanimi" kohta
        //neid massiivis üksteise järel läbi käies vaatame ükshaaval läbi, kas nad vastavad
        //meie nõudmistele
        //lugeda järgmist rida, kui:  iga konkreetse valideerimist vajava välja (valideeritavVali) 
        //kohta nõutud väljade hulgast (noutudValjad),
        //tee minu kehandis olevaid tegevusi!
        foreach($noutudValjad as $valideeritavVali)
        {
            salvestaEndaleSaadetudVormiEelmisedValjavaartused($valideeritavVali);
            kontrolliEtSynniaastaOleksNoutudVahemikus($valideeritavVali);
            kontrolliEtValiOleksSeatudJaTaidetud($valideeritavVali);
        }
        
        /*
         * Kui vigade massiiv on tühi, siis pole kasutaja vormi täitmisel ka vigu teinud.
         * Sellisel juhul võin tema sisestatud andmed järgmisele lehele saata
         */
        if (empty($vigadeMassiiv))
        {
            //Et sessiooni objekti me ei vaadelnud, siis kasutame GET meetodile omast, üle URL
            //andmete saatmist. Uue url-i (mis kasutaja koos tema sisestatud andmetega reaalselt ka 
            //uuele lehele saadab) koostame enne siia samasse, valideerimiseks postitatud 
            //vormi andmete abil. Nimelt, endale get meetodiga saadetud vorm jättis 
            //üles url-ile nimi-väärtus paarid (kui url-i vaatad). Neid kasutamegi, et uus url
            //kokku konstrueerida. 
            $urlKuhuVormiAndmedGETAbilSuunata = "VormiltSaadetudAndmeteKuvaja.php?nimi=" . $_GET['nimi'] . "&synniaasta=". $_GET['synniaasta'];
            //Suuname kasutaja koos tema andmetega nüüd juba uuele lehele, seda meie enda koostatud url-i
            //säilitava muutuja vahendusel
            header("Location: " . $urlKuhuVormiAndmedGETAbilSuunata);
        }
        else
        {
            //ilmnesid vead väljade täitmise juures
            $sonumVigadest = "Vormidel oli " . count($vigadeMassiiv) . " viga.";
        }
    }
?>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Vorm ja selle valideerija</title>
    </head>
    <body>
        <?php
        
            if (!empty($sonumVigadest))
            {
                echo '<p>' . $sonumVigadest .'</p>';
            } 
        ?>
        
        <form id="saatmisvorm" action="VormJaSelleValideerija.php" method="get">
            Nimi:       <input type="text" name="nimi" value="<?php echo kuvaJubaTaidetudSisuKuiOn('nimi')?>"/>
                            <?php echo kuvaKonkreetseValjaSisestusvigaKuiOn("nimi")?><br/>
            Järgneva välja väärtus peab mahtuma vahemikku 1900 - <?php echo date('Y')?>
            <br/>
            Sünniaasta  <input type="text" name="synniaasta" value="<?php echo kuvaJubaTaidetudSisuKuiOn('synniaasta') ?>"/>
                            <?php echo kuvaKonkreetseValjaSisestusvigaKuiOn("synniaasta")?><br/>
            <input type="submit" name="submitNupp" value="Valideeri ja saada"/>
        </form>
    </body>
</html>


<?php
    //Kui kasutaja on juba kord vormi täitnud, siis vaevalt, et kui viga tekib, ta viitsib neid 
    //uuesti täita. Seepärast säilitame tema sisestatud andmed, et need oleks alles ka pärast seda, 
    //kui vormi andmed iseendale valideerimiseks tagasi saadetakse. 
    function kuvaJubaTaidetudSisuKuiOn($valjanimi)
    {
        //Et mul on kasutatud superglobaaset sildistatud massiivi $GLOBALS
        //siis pole mul funktsiooni lokaalses skoobis eraldi defineerida, et 
        //kasutan antud skoobi piires näiteks mõnd globaalset muutujat, antud juhul 
        //muutujat   $kasutajaTaidetudValjadeSisuSailitajaMassiiv
        if (isset($GLOBALS["kasutajaTaidetudValjadeSisuSailitajaMassiiv"]) && 
                is_array($GLOBALS["kasutajaTaidetudValjadeSisuSailitajaMassiiv"]) && 
                !is_null($GLOBALS["kasutajaTaidetudValjadeSisuSailitajaMassiiv"]))
        {
            //et antud massiiv on sildistatud massiiv (associative array), siis uurin, kas kasutaja on 
            //ikka konkreetse välja ära täitnud. Kui sellisele sildile vastavat väärtus 
            //sildistatud massiivis pole, siis 
            //on kasutaja ka mingi vormi välja täitmata jätnud. Kui ei ole, siis lisatakse 
            //täidetud vormi väärtus massiivi, et seda vajadusel kasutajale vormi välja sisse uuesti panna. 
            if (array_key_exists($valjanimi, $GLOBALS["kasutajaTaidetudValjadeSisuSailitajaMassiiv"]))
            {
                return $GLOBALS["kasutajaTaidetudValjadeSisuSailitajaMassiiv"][$valjanimi];
            }
            else
            {
                return "";
            }
        }
        else
        {
            return "";
        }
    }

    function kuvaKonkreetseValjaSisestusvigaKuiOn($valjanimi)
    {
        if (isset($GLOBALS["vigadeMassiiv"]) && 
                is_array($GLOBALS["vigadeMassiiv"]) && 
                !is_null($GLOBALS["vigadeMassiiv"]))
        {
            if (array_key_exists($valjanimi, $GLOBALS["vigadeMassiiv"]))
            {
                return $GLOBALS["vigadeMassiiv"][$valjanimi];
            }
            else
            {
                return "";
            }
        }
        else
        {
            return "";
        }
    }

    function kontrolliEtValiOleksSeatudJaTaidetud($valideeritavVali)
    {
        //pöördun globaalse skoobi muutuja poole, et öelda interpretaatorile, et 
        //tahan seda muutujaväärtus siinses funktsiooni lokaalses skoobis kasutada.
        //alternatiiv on ka enne viljeletud superglobaalne sildistatud massiiv 
        //$GLOBALS
        global $vigadeMassiiv;

        if (!isset($_GET[$valideeritavVali]) || empty($_GET[$valideeritavVali]))
        {
            $vigadeMassiiv[$valideeritavVali] = " <b style='color:red'>Väli ei tohi olla tühi!</b>";
        }
    }

    function salvestaEndaleSaadetudVormiEelmisedValjavaartused($valideeritavVali)
    {
        global $kasutajaTaidetudValjadeSisuSailitajaMassiiv;

        if (isset($_GET[$valideeritavVali]))
        {
            //Sildistatud massiivile uue sildi => väärtus juurde panemine
            //panen massiivi sildi nimeks input välja name="" defineeritud nime
            //ning väärtuseks selle sama vormi input välja value="" väärtuse 
            //(mis antud juhul täitud, kui kasutaja vormi lahtrisse midagi kirjutab)
            $kasutajaTaidetudValjadeSisuSailitajaMassiiv[$valideeritavVali] = $_GET[$valideeritavVali];
        }
    }

    function kontrolliEtSynniaastaOleksNoutudVahemikus($valideeritavVali)
    {
        global $vigadeMassiiv;
        global $systeemiAastaarv;
        if (isset($_GET[$valideeritavVali]))
        {
            if ($valideeritavVali == "synniaasta")
            {
                if (!(MINIMAALNE_SISESTATAV_SYNNIAASTA_VAARTUS <= $_GET[$valideeritavVali] 
                        && $_GET[$valideeritavVali] <= $systeemiAastaarv))
                {
                    $vigadeMassiiv[$valideeritavVali] = " <b style='color:red'>Väli ei tohi olla tühi, 
                        ega asuda väljapool vahemikku 1900-" . date('Y') . "</b>";
                }
            }
        }
    }
?>